package co.droidforum.foodx.bo;

import javax.inject.Inject;

import org.springframework.http.HttpMethod;

import android.content.ContentValues;

import co.droidforum.foodx.application.BusinessContext;
import co.droidforum.foodx.application.BusinessObject;
import co.droidforum.foodx.application.SessionValueName;
import co.droidforum.foodx.dao.TokenDAO;
import co.droidforum.foodx.model.UsuarioDTO;
import co.droidforum.foodx.ws.RemoteBusinessServiceException;
import co.droidforum.foodx.ws.RemoteConnectionServiceException;
import co.droidforum.foodx.ws.ServiceCommunication;
import co.droidforum.foodx.ws.ServiceResources;


/**
 * 
 * Clase que contiene la logica de negocio para toda la logica requerida de usuario
 * 
 * @author carlos.munoz | @cdmunozi
 * @since 2012/06/08
 * 
 */
@BusinessObject
public class UsuarioBO {

@Inject TokenDAO tokenDAO;
	
	/**
	 * Valida si existe un token registrado en el sistema
	 * 
	 * @return True o false indicando si existe o no el token
	 */
	public boolean validarExisteToken(){
		//Se valida si el token existe
		String token = tokenDAO.getToken();
		if(token != null && !token.equals("")){
			BusinessContext.putSessionData(SessionValueName.TOKEN, token);
			return true;
		}
		return false;
	}
	
	/**
	 * Permite autenticar al usuario en el sistema para que pueda utilizar las
	 * opciones que este tiene disponible.
	 * 
	 * @param usuarioDTO
	 * @throws RemoteBusinessServiceException
	 * @throws RemoteConnectionServiceException
	 */
	public void autenticarUsuario(UsuarioDTO usuarioDTO) throws RemoteBusinessServiceException, RemoteConnectionServiceException {
		
		//Se realiza la comunicacion con el sistema
		String uri = ServiceResources.PATH_WS_USUARIOS + ServiceResources.PATH_WS_USUARIOS_LOGIN;
		ServiceCommunication serviceCommunication = ServiceCommunication.getInstance();
		String token = serviceCommunication.sendResponseDataTEXT(uri, HttpMethod.POST, usuarioDTO, null);
		
		//consulta si existe un token y lo elimina
		boolean existeToken = validarExisteToken();
		if(existeToken){
			tokenDAO.deleteToken();
		}
		
		if(token != null && !token.equalsIgnoreCase("")){
			//Se almacena el token
			ContentValues cv = new ContentValues();
			cv.put("token", token);
			tokenDAO.insertToken(cv);
			
			//El token se monta a la session de la aplicacion
			BusinessContext.putSessionData(SessionValueName.TOKEN, token);
		}
		
	}
	
	/**
	 * Permite registrar al usuario por primera vez en el sistema
	 * para que pueda ser generado el token en el servidor y ser
	 * almacenado en el dispositivo.
	 * 
	 * El token siempre debe ser enviado a todos los web services de la
	 * aplicacion de teda que vayan a ser usados por el dispositivo.
	 * 
	 * @param usuarioDTO
	 */
	public void autenticarUsuarioPrimeraVez(UsuarioDTO usuarioDTO) throws RemoteBusinessServiceException, RemoteConnectionServiceException {
		//Se realiza la comunicacion con el sistema
		String uri = ServiceResources.PATH_WS_USUARIOS + ServiceResources.PATH_WS_USUARIOS_REGISTRO;
		ServiceCommunication serviceCommunication = ServiceCommunication.getInstance();
		String token = serviceCommunication.sendResponseDataTEXT(uri, HttpMethod.POST, usuarioDTO, null);
		
		if(token != null && !token.equalsIgnoreCase("")){
			//Se almacena el token
			ContentValues cv = new ContentValues();
			cv.put("token", token);
			tokenDAO.insertToken(cv);
			
			//El token se monta a la session de la aplicacion
			BusinessContext.putSessionData(SessionValueName.TOKEN, token);
		}
				
	}
}
